//
//  LYJListSectionService.m
//  Pods
//
//  Created by 李亚军 on 17/3/28.
//
//

#import "LYJListSectionService.h"

@implementation LYJListSectionService

/**
 作用: 排序

 @param sortedArray 需要排序的数组
 @param isAscending YES 升序,NO 降序
 @param compareName 比较的参数名称,如果数组存放的是字典或者模型类,compareName 就是字典的 key 值, 或者模型的属性名称 , 如果数组中存储的是普通对象类型 compareName 为 设置为 nil
 @return 返回排序好的数组
 */
+ (NSArray *)sorted:(NSArray *)sortedArray isAscending:(Boolean)isAscending compareName:(NSString *)compareName {
    
    if (sortedArray.count == 0) { // 如果数组为空返回空数组
        
        return sortedArray;
    }
    
    if (compareName == nil) { // 如果为nil 直接比较对象
        
        NSArray *arr = [sortedArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
            
            NSComparisonResult result;
            if ([obj1 isKindOfClass:[NSString class]]) { // 如果是字符串,这里进行一下转化,防止字符串中有汉字,如果有汉字字符串这里转化成拼音
                
                obj1 = [self pinyinWithString:obj1];
                obj2 = [self pinyinWithString:obj2];
            }
            
            result = [obj1 compare:obj2];
            
            if (isAscending) { // 如果升序
                
                if (result == NSOrderedAscending) { return NSOrderedAscending;}else {return NSOrderedDescending;}
            }else {
                
                if (result == NSOrderedAscending) { return NSOrderedDescending;}else {return NSOrderedAscending;}
                
            }
        }];
        
        return arr;
    }
    
    NSArray *arr = [sortedArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) { // 模型,字典在这里比较
        
        NSString *value1 = [obj1 valueForKey:compareName];
        
        NSString *value2 = [obj2 valueForKey:compareName];
        
        if ([value1 isKindOfClass:[NSString class]]) { // 如果是字符串这里进行拼音转化,防止字符串中有汉字
            if (value1 != nil) {
                
                value1 = [self pinyinWithString:value1];
            }
            if (value2 != nil) {
                
                value2 = [self pinyinWithString:value2];
            }
        }
        
        
        if (value1 == nil || value2 == nil) {
            
            return NSOrderedSame;
        }else {
            
            NSComparisonResult result = [value1 compare:value2];
            
            if (isAscending) { // 如果升序
                
                if (result == NSOrderedAscending) {
                    return NSOrderedAscending;
                }else {
                    return NSOrderedDescending;
                }
            }else {
                
                if (result == NSOrderedAscending) {
                    return NSOrderedDescending;
                }else {
                    return NSOrderedAscending;
                }
            }
        }
    }];
    
    return arr;
}


/**
 作用: 将汉字转化为英文

 @param string 汉字字符串
 @return 返回汉字拼音
 */
+ (NSString *)pinyinWithString:(NSString *)string {
    
    NSMutableString *str = [NSMutableString stringWithString:string];
    CFStringTransform((CFMutableStringRef) str, NULL, kCFStringTransformMandarinLatin, NO);
    CFStringTransform((CFMutableStringRef) str, NULL, kCFStringTransformStripDiacritics, NO);
    NSString *pinYin = [str capitalizedString];
    return pinYin;
}



/**
 作用: 获取字符串的首字母

 @param string 输入的字符串
 @return 返回输入字符串中的首字母(大)
 */
+ (NSString *)firstCharactorWithString:(NSString *)string
{
    NSMutableString *str = [NSMutableString stringWithString:string];
    CFStringTransform((CFMutableStringRef) str, NULL, kCFStringTransformMandarinLatin, NO);
    CFStringTransform((CFMutableStringRef) str, NULL, kCFStringTransformStripDiacritics, NO);
    NSString *pinYin = [str capitalizedString];
    return [pinYin substringToIndex:1];
}


/**
 作用: 将列表数组进行分区,并排序

 @param array 将要分区的数组
 @param isAscending YES 升序 , NO 降序
 @param sectionName 如果数组中存放的是字典 sectionName 是字典存在的 key 值,我们对数组进行分区的依据 key 对应的 value , 如果 value 相同那么他们在一个分区 , 如果数组中存放的是模型例如:UserModel , 有一个属性名称 name , sectionName 是模型中的属性名称 name, 我们对数组进行分区的依据是 模型 UserModel 属性 name 对应的 value
 @return 返回分好区的数组并排序顺序
 */
+ (NSArray *)sectionArrayWithArray:(NSArray *)array isAscending:(BOOL)isAscending sectionName:(NSString *)sectionName {
    
    NSArray *sortedArray = [self sorted:array isAscending:isAscending compareName:sectionName]; // 首先对数组进行排序
    
    NSMutableArray *sectionArray = [NSMutableArray array]; // 存储分区好的数组
    
    if (array == nil || array.count == 0) {
        
        return sectionArray;
    }
    
    NSMutableDictionary *sectionDictionary = [NSMutableDictionary dictionary]; // 存储区分好的数组,这个字典中 key 值是我们分区的依据也就是 sectionName 对应的 value , key 值对应的 value 是 sectionName 对应的 value 值相同的对象集合,这里集合类型是数组
    
    for (id objc in sortedArray) {
        
        NSString *valueString = [NSString stringWithFormat:@"%@" , [objc valueForKey:sectionName]]; // 获取 sectionName 对应的 value
        if ([sectionDictionary.allKeys containsObject:valueString]) { // 字典中是否有这个值, 如果有
            
            NSMutableArray *sectionArrayTemp = [sectionDictionary valueForKey:valueString]; // 如果字典中有这个key的value,取出这里的数组
            [sectionArrayTemp addObject:objc];
            [sectionDictionary setValue:sectionArrayTemp forKey:valueString]; // 这里更新对应 key 的 value
        }else {
            
            NSMutableArray *sectionArraryTemp = [NSMutableArray array];
            [sectionArraryTemp addObject:objc];
            [sectionDictionary setValue:sectionArraryTemp forKey:valueString];
        }
    }
    
    NSArray *allKeysArray = [self sorted:sectionDictionary.allKeys isAscending:isAscending compareName:nil]; // 获取字典中 key 的数组并排序
    for (NSString *keyName in allKeysArray) { // 所有 key 值对应的集合(数组)进行排序
        
        NSArray *sectionArrayTemp = (NSArray *)sectionDictionary[keyName]; // 取出字典中的数组
        NSArray *sectionSortedArray = [self sorted:sectionArrayTemp isAscending:isAscending compareName:sectionName]; // 每一个分区的数组进行排序
        [sectionArray addObject:sectionSortedArray]; // 排序好的数组添加到总的数组中
    }
    
    return sectionArray;
}


@end
